/**
 * 
 */
package sistema;

import interfaces.IGenericObject;

import java.util.List;
import java.util.Scanner;

import objetos.Emprestimo;
import objetos.Item;
import objetos.Usuario;
import facade.SistemaFacade;
import factory.DAOFactory;

/**
 * 
 * @author Felipe Jose, Filipe Alencar, Rodrigo de Brito, Thiago Goncalves, Victor Hugo Arcelino;
 *
 */
public class InterfaceTexto {

	private static final int NUMBER_OF_OPTIONS = 4;// change me to add more options
	private static Scanner input;
	private static GerenciadorDeDados gerenciadorUsuarios = new GerenciadorDeDados(DAOFactory.createUsuarioDAO());
	private static GerenciadorDeDados gerenciadorItens = new GerenciadorDeDados(DAOFactory.createItemDAO());
	private static SistemaFacade sistemaFacade = new SistemaFacade();
	private static String idSessao;
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		menuInicial();

	}

	public static void imprimeMenuInicial(){
		StringBuilder menuTexto = new StringBuilder();
		menuTexto.append("1 - Cadastre usuario\n");
		menuTexto.append("2 - Entrar no sistema\n");
		menuTexto.append("3 - Sair\n");
		System.out.println(menuTexto.toString());
	}

	public static void menuInicial() throws Exception{
		input = new Scanner(System.in);
		imprimeCabecalho();

		int option;
		do {
			imprimeMenuInicial();
			option = readIntegerOption("> ", 1, NUMBER_OF_OPTIONS);
			switch (option) {
			case 1:
				cadastroUsuario();
				break;
			case 2:
				entrarNoSistema();
				break;
			case 3:
				System.exit(1);
			case 4:
				break;
			
				// option!
			default:
				// There's no default behaviour in this case.
				break;
			}
		} while (option != NUMBER_OF_OPTIONS);

		System.out.println("Obrigado!");
	}

	private static void entrarNoSistema() throws Exception  {
		input = new Scanner(System.in);
		System.out.println("Digite seu login: ");
		String login = input.nextLine();
		System.out.println("Digite sua senha: ");
		String senha = input.nextLine();
		Usuario userCadastrado = null;
		try {
			userCadastrado = (Usuario) gerenciadorUsuarios.pesquisar("login", login).get(0);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		if( userCadastrado!= null && userCadastrado.getSenha().equals(senha)){
			idSessao = String.valueOf(sistemaFacade.abrirSessao(login));
			funcionalidadesDoSistema();
		}

	}

	@SuppressWarnings("unused")
	private static void Mensagem(){
		StringBuilder sb = new StringBuilder();
		sb.append("	   (1)Cadastrar mensagem de um emprestimo\n");
		sb.append("    (2)Cadastrar mensagem off-topic\n");
		sb.append("    (3)Sair da funcionalidade\n");
		System.out.println(sb.toString());
	}
	
	private static void menuDeFuncionalidades() {
		StringBuilder sb = new StringBuilder();
		sb.append("\n ====== Ol√° voc√™ foi logado com sucesso! ======\n");
		sb.append("\nQue opera√ß√£o voc√™ deseja realizar?\n");
		sb.append("    (1)Cadastrar itens\n");
		sb.append("    (2)Localizar usuario\n");
		sb.append("    (3)Visualizar perfil\n");
		sb.append("    (4)Aprovar Requisicoes de Amizade\n");
		sb.append("    (5)Requisitar Emprestimo\n");
		sb.append("    (6)Aprovar Requisicoes de Emprestimo\n");
		sb.append("    (7)Desfazer amizade\n");
		sb.append("    (8)Apagar item\n");
		sb.append("    (9)Visualizar Ranking\n");
		sb.append("    (10)Pesquisar Itens\n");
		sb.append("    (11)Registrar interesse em itens\n");
		sb.append("    (12)Registrar mensagem\n"); //Implementacao Nova! Milestone2
		sb.append("    (13)Visualizar mensagem\n"); //Implementacao Nova! Milestone2
		sb.append("    (14)Requisitar e confirmar devolucao\n"); //Implementacao Nova! Milestone2
		sb.append("    (15)Historico de atividades do usuario\n"); //Implementacao Nova! Milestone2
		sb.append("    (16)Historico de atividades do usuario e seus amigos\n"); //Implementacao Nova! Milestone2
		sb.append("    (17)Oferecer item\n"); //Implementacao Nova! Milestone2
		sb.append("    (18)Publicar item\n"); //Implementacao Nova! Milestone2
		sb.append("    (19)Logout\n");
		System.out.println(sb.toString());

	}

	private static void funcionalidadesDoSistema() throws Exception {
		int opcao = 1;
		while(opcao!=6){
			menuDeFuncionalidades();
			opcao = lerOpcao("> ");
			switch (opcao) {
			case 1:
				cadastrarItens();
				break;
			case 2:
				localizarUsuario();
				break;
			case 3:
				visualizarPerfil();
				break;
			case 4:
				try {
					aprovarAmizade();
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 5:
				requisitarEmprestimo();
				break;
			case 6:
				try {
					aprovarEmprestimo();
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 7:
				desfazerAmizade();
				break;
			case 8:
				apagarItem();
				break;
			case 9:
				visualizarRanking();
				break;
			case 10:
				pesquisarItens();
				break;
			case 11:
				registrarInteresseEmItem();
				break;
			case 12:
				registrarMensagem();
				break;
			case 13:
				visualizarMensagem();
				break;
			case 14:
				devolucaoDeItem();
				break;
			case 15:
				historicoAtividadesUsuario();
				break;
			case 16:
				historicoAtividadesConjuntas();
				break;
			case 17:
				oferecerItem();
				break;
			case 18:
				publicarItem();
				break;
			case 19:
				menuInicial();
				break;
			default:
				System.out.println("Op√ß√£o inv√°lida!");
				break;
			}
		}	

	}

	private static void publicarItem() {
		System.out.println("Nome do Item: ");
		String nomeItem = input.nextLine();
		System.out.println("Descricao do Item: ");
		String descricaoItem = input.nextLine();
		try{
			String idPublicacaoPedido = sistemaFacade.publicarPedido(idSessao, nomeItem, descricaoItem);
			System.out.println("Publicacao realizada com sucesso! O id da mesma eh: " + idPublicacaoPedido + "!");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
		
	}

	private static void oferecerItem() {
		System.out.println("ID da Publicacao do Pedido: ");
		String idPublicacaoPedido = input.nextLine();
		System.out.println("ID do Item: ");
		String idItem = input.nextLine();
		try{
			sistemaFacade.oferecerItem(idSessao, idPublicacaoPedido, idItem);
			System.out.println("Oferta realizada com sucesso!");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

	private static void historicoAtividadesConjuntas() {
		try {
			System.out.println(sistemaFacade.historicoAtividadesConjunto(idSessao));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	private static void historicoAtividadesUsuario() {
		try {
			System.out.println(sistemaFacade.historicoAtividades(idSessao));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	private static void menuDevolucaoItem(){
		StringBuilder sb = new StringBuilder();
		sb.append("    (1)Requisitar devolucao de item\n");
		sb.append("    (2)Confirmar o recebimento do item\n");
		sb.append("    (3)Voltar ao menu principal\n");
		System.out.println(sb.toString());
	}
	
	private static void devolucaoDeItem() throws Exception {
		int opcao = 1;
		while (true){
			menuDevolucaoItem();
			opcao = lerOpcao("> ");
			switch(opcao){
			case 1:
				requisitarDevolucao();
				break;
			case 2:
				confirmarDevolucao();
				break;
			case 3:
				funcionalidadesDoSistema();
				break;
			default:
				System.out.println("Op√ß√£o inv√°lida!");
				break;
			}
		}
	}

	private static void confirmarDevolucao() {
		System.out.println("ID do Emprestimo: ");
		String idEmprestimo = input.nextLine();
		try{
			sistemaFacade.confirmarTerminoEmprestimo(idSessao, idEmprestimo);
			System.out.println("Confirmacao realizada com sucesso!");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

	private static void requisitarDevolucao() {
		System.out.println("ID do Emprestimo: ");
		String idEmprestimo = input.nextLine();
		try{
			sistemaFacade.devolverItem(idSessao, idEmprestimo);
			System.out.println("Requisicao realizada com sucesso!");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

	private static void menuVisualizarMensagem(){
		StringBuilder sb = new StringBuilder();
		sb.append("    (1)Visualizar topico\n");
		sb.append("    (2)Visualizar lista de mensagens de um topico\n");
		sb.append("    (3)Voltar ao menu principal\n");
		System.out.println(sb.toString());
	}
	
	private static void visualizarTopico(){
		System.out.println("Tipo do Topico(negociacao/offtopic/todos):");
		String tipo = input.nextLine();
		try{
			System.out.println(sistemaFacade.lerTopicos(idSessao, tipo) + "\n");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
	
	private static void visualizarListaMensagens(){
		System.out.println("ID do Topico: ");
		String idTopico = input.nextLine();
		try{
			System.out.println(sistemaFacade.lerMensagens(idSessao, idTopico) + "\n");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
	
	private static void visualizarMensagem() throws Exception {
		int opcao = 1;
		while (true){
			menuVisualizarMensagem();
			opcao = lerOpcao("> ");
			switch(opcao){
			case 1:
				visualizarTopico();
				break;
			case 2:
				visualizarListaMensagens();
				break;
			case 3:
				funcionalidadesDoSistema();
				break;
			default:
				System.out.println("Op√ß√£o inv√°lida!");
				break;
			}
		}
	}

	private static void registrarMensagem() throws Exception {
		int opcao = 1;
		while (true){
			menuRegistroMensagem();
			opcao = lerOpcao("> ");
			switch(opcao){
			case 1:
				registrarMensagemEmprestimo();
				break;
			case 2:
				registrarMensagemOffTopic();
				break;
			case 3:
				funcionalidadesDoSistema();
				break;
			default:
				System.out.println("Op√ß√£o inv√°lida!");
				break;
			}
		}
	}

	private static void menuRegistroMensagem() {
		StringBuilder sb = new StringBuilder();
		sb.append("    (1)Registrar mensagem de emprestimo\n");
		sb.append("    (2)Registrar mensagem off-topic\n");
		sb.append("    (3)Voltar ao menu principal\n");
		System.out.println(sb.toString());
	}

	private static void registrarMensagemEmprestimo() {
		System.out.println("Destinatario: ");
		String destinatario = input.nextLine();
		System.out.println("Assunto: ");
		String assunto = input.nextLine();
		System.out.println("Mensagem: ");
		String mensagem = input.nextLine();
		System.out.println("ID Requisicao do Emprestimo: ");
		String idRequisicao = input.nextLine();
		try{
			String idTopico = sistemaFacade.enviarMensagem(idSessao, destinatario, assunto, mensagem, idRequisicao);
			System.out.println("Mensagem enviada com sucesso e o ID do topico eh: " + idTopico + "!\n");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

	private static void registrarMensagemOffTopic() {
		System.out.println("Destinatario: ");
		String destinatario = input.nextLine();
		System.out.println("Assunto: ");
		String assunto = input.nextLine();
		System.out.println("Mensagem: ");
		String mensagem = input.nextLine();
		try{
			String idTopico = sistemaFacade.enviarMensagem(idSessao, destinatario, assunto, mensagem);
			System.out.println("Mensagem enviada com sucesso e o ID do topico eh: " + idTopico + "!\n");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
		
	}

	private static void registrarInteresseEmItem() {
		List<IGenericObject> itens = gerenciadorItens.pesquisarTodos();
		String itensCadastrados = "";
		for (IGenericObject item : itens) {
			itensCadastrados += ((Item)item).getNome() + "; ";
		}
		System.out.println("Itens Cadastrados: " + itensCadastrados );
		System.out.println("Digite o nome do item que voce deseja registrar interesse: ");
		String nomeItem = input.nextLine();
		Item itemDeInteresse = null;
		try {
			itemDeInteresse = (Item) gerenciadorItens.pesquisar("nome", nomeItem).get(0);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		try {
			sistemaFacade.registrarInteresse(idSessao,""+itemDeInteresse.getId());
			System.out.println("Interesse registrado com sucesso!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}

	private static void pesquisarItens() {
		System.out.println("Informe a chave da pesquisa de itens: ");
		String chave = input.nextLine();
		System.out.println("Informe o atributo da pesquisa: ");
		String atributo = input.nextLine();
		StringBuilder sb = new StringBuilder();
		sb.append("Informe o tipo de ordenacao: ");
		sb.append("		(1)Crescente");
		sb.append("		(2)Decrescente");
		System.out.println(sb.toString());
		int opcao = lerOpcao("> ");
		StringBuilder sb2 = new StringBuilder();
		sb2.append("Informe o criterio de ordenacao: ");
		sb2.append("		(1)Data de Criacao");
		sb2.append("		(2)Reputacao");
		System.out.println(sb2.toString());
		int opcao2 = lerOpcao("> ");
		String tipoOrdenacao = null;
		String criterioOrdenacao = null;
		if(opcao == 1){
			tipoOrdenacao = "crescente";
		}else if(opcao == 2){
			tipoOrdenacao = "decrescente";
			
		}
		if(opcao2 == 1){
			criterioOrdenacao = "dataCriacao";
		}else if(opcao2 == 2){
			criterioOrdenacao = "reputacao";
		}
		try {
			System.out.println("Resultado da pesquisa : " + sistemaFacade.pesquisarItem(idSessao, chave, atributo, tipoOrdenacao, criterioOrdenacao));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}

	private static void visualizarRanking() {
		StringBuilder sb = new StringBuilder();
		sb.append("(1)Raking Global");
		sb.append("(2)Ranking entre amigos");
		int opcao = lerOpcao("> ");
		switch (opcao) {
		case 1:
			try {
				System.out.println("Ranking global: " +  sistemaFacade.getRanking(idSessao, "global"));
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
			break;
		case 2:
			try {
				System.out.println("Ranking entre amigos: " + sistemaFacade.getRanking(idSessao, "amigos"));
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		default:
			System.out.println("Opcao invalida!");
			break;
		}
	}

	private static void apagarItem() {
		try {
			exibirListaDeItens();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		System.out.println("Digite o nome do item a ser removido: ");
		String nomeDoItem = input.nextLine();
		Item itemARemover = null;
		try {
			itemARemover = (Item) gerenciadorItens.pesquisar("nomeCompleto", nomeDoItem).get(0);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		try {
			sistemaFacade.apagarItem(idSessao, String.valueOf(itemARemover.getId()));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	private static void desfazerAmizade()  {
		try {
			exibirListaDeAmigos();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		System.out.println("Digite o login do amigo que devera ser removido: ");
		String loginDoAmigo = input.nextLine();
		try {
			sistemaFacade.desfazerAmizade(idSessao, loginDoAmigo);
			System.out.println("Amigo: " + loginDoAmigo + " foi removido com sucesso!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	
	}

	private static void requisitarEmprestimo() {
		try {
			exibirListaDeAmigos();
			System.out.println("Login do amigo que voce deseja requisitar o item:");
			String login = input.nextLine();
			exibirListaDeItensDeOutros(idSessao,login);
			System.out.println("Digite o nome completo do item a ser emprestado:");
			String nomeDoItem = input.nextLine();
			System.out.println("Determine a duracao do emprestimo:\n");
			String duracaoDoEmprestimo = input.nextLine();
			Item item = (Item) gerenciadorItens.pesquisar("nomeCompleto", nomeDoItem).get(0);
			int idRequisicao = sistemaFacade.requisitarEmprestimo(idSessao, ""+ item.getId(), Integer.parseInt(duracaoDoEmprestimo));
			System.out.println("A requisicao foi realizada com sucesso! O seu id de requisicao eh: " + idRequisicao);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

	}

	private static void aprovarEmprestimo() throws Exception{
		exibirRequisicoesDeEmprestimo();
		List<Emprestimo> emprestimosPendentes = retornaUsuarioPeloIdSessao().getListaEmprestimosPendentes();
		StringBuilder sb = new StringBuilder();
		sb.append("Deseja aceitar as solicitacoes de emprestimo: ");
		sb.append("     (1)Sim");
		sb.append("     (2)N√£o");
		System.out.println(sb.toString());
		int opcao = lerOpcao("> ");
		switch (opcao) {
		case 1:
			for (Emprestimo emprestimo : emprestimosPendentes) {
				if(emprestimo != null){
					Integer idEmprestimo = sistemaFacade.aprovarEmprestimo(idSessao, String.valueOf(emprestimo.getIdRequisicaoEmprestimo()));
					System.out.println("Aprovacao realizada com sucesso! O ID do Emprestimo eh: " + idEmprestimo);
				}
			}
			break;
		case 2:
			break;
		default:
			System.out.println("Opcao invalida!");
			break;
		}

	}


	private static void exibirRequisicoesDeEmprestimo() throws Exception{
		Usuario usuarioLogado = retornaUsuarioPeloIdSessao();
		StringBuilder sb = new StringBuilder();
		sb.append("Voce possui requisicoes de emprestimo:\n");
		int quantidadeEmprestimoPendentes = 0;
		if(!usuarioLogado.getListaEmprestimosPendentes().isEmpty()){
			for (Emprestimo emprestimoPendente : usuarioLogado.getListaEmprestimosPendentes()) {
				quantidadeEmprestimoPendentes++;
				sb.append("(" + quantidadeEmprestimoPendentes + ") " + "Requesicao de emprestimo do item: " + emprestimoPendente.getItemAEmprestar().getNome());
			}
		}else{
			throw new Exception("Voce nao possui requisicoes de emprestimo!\n");
		}
		System.out.println(sb.toString());

	}

	private static void visualizarPerfil() {
		System.out.println("========== Informa√ß√µes de Cadastro ==========\n");
		System.out.println("Nome: " + (sistemaFacade.getSistema().getListaDeSessoesAbertas().get(Integer.parseInt(idSessao)).getNome()));
		System.out.println("Login: " + sistemaFacade.getSistema().getListaDeSessoesAbertas().get(Integer.parseInt(idSessao)).getLogin());
		System.out.println("Endere√ßo: " + sistemaFacade.getSistema().getListaDeSessoesAbertas().get(Integer.parseInt(idSessao)).getEndereco());
		System.out.println("==========    Lista de Amigos      ============\n");
		try {
			exibirListaDeAmigos();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		System.out.println("==========    Lista de Itens      ============\n");
		try {
			exibirListaDeItens();
		} catch (Exception e) {

			System.out.println(e.getMessage());
		}
	}

	private static void visualizarPerfilDeOutros(String idSessao, String login) throws Exception{
		System.out.println("========== Informa√ß√µes de Cadastro ==========\n");
		System.out.println("Nome: " + sistemaFacade.getAtributoUsuario(login, "nome"));
		System.out.println("Login: " + login);
		System.out.println("Endere√ßo: " + sistemaFacade.getAtributoUsuario(login, "endereco"));
		System.out.println("==========    Lista de Amigos      ============\n");
		try {
			exibirListaDeAmigosDeOutros(idSessao, login);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		System.out.println("==========    Lista de Itens      ============\n");
		try {
			exibirListaDeItensDeOutros(idSessao, login);
		} catch (Exception e) {

			System.out.println(e.getMessage());
		}
	}


	private static Usuario retornaUsuarioPeloIdSessao() {
		return sistemaFacade.getSistema().getListaDeSessoesAbertas().get(Integer.parseInt(idSessao));
	}

	private static void exibirListaDeItens() throws Exception {
		String itensAdicionados = sistemaFacade.getItens(idSessao);
		System.out.println("Lista de Itens de " + sistemaFacade.getSistema().getListaDeSessoesAbertas().get(Integer.parseInt(idSessao)).getLogin() + ": " + itensAdicionados);
		
	}

	private static void exibirListaDeItensDeOutros(String idSessao, String login) throws Exception {
		String itensAdicionados = sistemaFacade.getItens(idSessao,login);
		System.out.println("Lista de Itens de " + login + ": " + itensAdicionados);
	}

	private static void exibirListaDeAmigos() throws Exception {
		String amigosAdicionados = sistemaFacade.getAmigos(idSessao);
		System.out.println("Lista de Amigos de " + sistemaFacade.getSistema().getListaDeSessoesAbertas().get(Integer.parseInt(idSessao)).getLogin() + ": " + amigosAdicionados );
	}

	private static void exibirListaDeAmigosDeOutros(String idSessao, String login) throws Exception {
		String amigosAdicionados = sistemaFacade.getAmigos(idSessao, login);
		System.out.println("Lista de Amigos de " + login + ": " + amigosAdicionados );
	}

	private static void localizarUsuario() {
		StringBuilder sb = new StringBuilder();
		sb.append("(1)Pesquisar usuario por nome.\n");
		sb.append("(2)Pesquisar usuario por endereco.\n");
		System.out.println(sb.toString());
		int opcao = lerOpcao("Opcao: ");
		if(opcao == 1){
			System.out.println("Informe o nome do usuario: ");
			String nome = input.nextLine();
			try {
				String usuarioPesquisado = sistemaFacade.localizarUsuario(idSessao, nome, "nome");
				System.out.println("Resultado da pesquisa: " + usuarioPesquisado)  ;
				if(!usuarioPesquisado.equals("Nenhum usu√°rio encontrado"))
					funcionalidadesDeAmigosDoUsuario();
			} catch (Exception e) {
				System.out.println(e.getMessage());

			}
		}else if(opcao == 2){
			System.out.println("Informe o endereco do usuario: ");
			String endereco = input.nextLine();
			try {
				String usuarioPesquisado = sistemaFacade.localizarUsuario(idSessao, endereco, "endereco");
				System.out.println("Resultado da pesquisa: " + usuarioPesquisado);
				//menuDeRequisicaoDeAmizade();
				if(!usuarioPesquisado.equals("Nenhum usu√°rio encontrado"))
					funcionalidadesDeAmigosDoUsuario();
			} catch (Exception e) {
				System.out.println(e.getMessage());

			}
		}

	}

	private static void funcionalidadesDeAmigosDoUsuario(){
		StringBuilder sb = new StringBuilder();
		sb.append("(1) Requisitar amizade\n");
		sb.append("(2) Visualizar perfil de usu√°rio\n");
		System.out.println(sb.toString());
		int opcao = lerOpcao("> ");
		switch (opcao) {
		case 1:
			menuDeRequisicaoDeAmizade();
			break;
		case 2:
			menuVisualizarPerfilDeOutrosUsuarios();
		default:
			//System.out.println("Opcao invalida!");
			break;
		}
	}

	private static void menuDeRequisicaoDeAmizade(){
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("\n Deseja adicionar algum dos usuarios pesquisados:\n");
		stringBuilder.append("     (1)Sim");
		stringBuilder.append("     (2)Nao");
		System.out.println(stringBuilder.toString());
		int option = lerOpcao(">");
		switch (option) {
		case 1:
			try {
				requisitarAmizade();
			} catch (Exception e) {

				System.out.println(e.getMessage());
			}
			break;
		case 2:
			return;
		default:	
			System.out.println("Opcao Invalida!");
			break;
		}

	}

	private static void menuVisualizarPerfilDeOutrosUsuarios(){
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("\n Deseja visualizar o perfil de algum dos usuarios pesquisados:\n");
		stringBuilder.append("     (1)Sim");
		stringBuilder.append("     (2)Nao");
		System.out.println(stringBuilder.toString());
		int option = lerOpcao(">");
		switch (option) {
		case 1:
			try {
				visualizarPerfilDeOutrosUsuarios();
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
			break;
		case 2:
			return;
		default:	
			System.out.println("Opcao Invalida!");
		}
	}

	private static void visualizarPerfilDeOutrosUsuarios() throws Exception{
		System.out.println("\nDigite o nome completo do usuario que voce deseja visualizar o perfil :\n ");
		String nome = input.nextLine();
		Usuario userPesquisado = null;
		try {
			userPesquisado = (Usuario) gerenciadorUsuarios.pesquisar("nomeCompleto", nome).get(0);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		visualizarPerfilDeOutros(idSessao, userPesquisado.getLogin());

	}
	private static void requisitarAmizade() throws Exception {
		System.out.println("\nDigite o nome completo do usuario que deseja adicionar:\n ");
		String nome = input.nextLine();
		Usuario userPesquisado = null;
		try {
			userPesquisado = (Usuario) gerenciadorUsuarios.pesquisar("nomeCompleto", nome).get(0);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		//		String msgDeAmizadesPendentes = "Voc√™ tem requisi√ß√µes de amizade";
		//		String assunto = "Requisicao de amizade de: " + retornaUsuarioPeloIdSessao().getLogin();
		//		Mensagem msgRequisicaoAmizade = null;
		//		try {
		//			msgRequisicaoAmizade = new Mensagem(assunto , msgDeAmizadesPendentes, userPesquisado, retornaUsuarioPeloIdSessao());
		//		} catch (Exception e) {
		//			System.out.println(e.getMessage());
		//		}
		sistemaFacade.requisitarAmizade(idSessao, userPesquisado.getLogin());
		//		userPesquisado.getGerenciadorDeMensagens().getMensagensRecebidas().add(msgRequisicaoAmizade);
		System.out.println("Solicita√ß√£o de amizade enviada.");

	}

	private static void aprovarAmizade() throws Exception{
		exibirRequisicoesDeAmizade();
		List<Usuario> usuariosPendentes = retornaUsuarioPeloIdSessao().getListaDeAmigosPendentes();
		StringBuilder sb = new StringBuilder();
		sb.append("Deseja aceitar as solicitacoes de amizade: ");
		sb.append("     (1)Sim");
		sb.append("     (2)N√£o");
		System.out.println(sb.toString());
		int opcao = lerOpcao("> ");
		switch (opcao) {
		case 1:
			for (Usuario usuario : usuariosPendentes) {
				if(usuario != null){
					sistemaFacade.aprovarAmizade(idSessao, usuario.getLogin());
				}
			}
			break;
		case 2:
			break;
		default:
			System.out.println("Opcao invalida!");
			break;
		}
	}


	private static void exibirRequisicoesDeAmizade() throws Exception{
		Usuario usuarioLogado = retornaUsuarioPeloIdSessao();
		StringBuilder sb = new StringBuilder();
		sb.append("Voce possui requisicoes de amizade de:\n");
		int quantidadeUserPendentes = 0;
		if(!usuarioLogado.getListaDeAmigosPendentes().isEmpty()){
			for (Usuario usuarioPendente : usuarioLogado.getListaDeAmigosPendentes()) {
				quantidadeUserPendentes++;
				sb.append("(" + quantidadeUserPendentes + ") " + usuarioPendente.getNome());
			}

		}else{
			throw new Exception("Voce nao possui requisicoes de amizade!");
		}
		System.out.println(sb.toString());

	}


	private static void cadastrarItens() {
		System.out.println("Informe o nome do item: ");
		String nome = input.nextLine();
		System.out.println("Informe a descri√ß√£o do item: ");
		String descricao = input.nextLine();
		System.out.println("Informe a categoria do item: ");
		String categoria = input.nextLine();
		try {
			Integer idItem = sistemaFacade.cadastrarItem(idSessao, nome, descricao, categoria);
			System.out.println("Item cadastrado com sucesso! O ID do Item eh: " + idItem + "!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

	}


	/**
	 * Cadastra as atividades.
	 * @throws Exception
	 * 			
	 */

	private static void cadastroUsuario() {
		input = new Scanner(System.in);
		System.out.println("Cadastre o nome do usuario: ");
		String nome = input.nextLine();
		System.out.println("Cadastre o login do usuario: ");
		String login = input.nextLine();
		System.out.println("Cadastre a senha do usuario: ");
		String senha = input.nextLine();
		System.out.println("Cadastre o endereco do usuario: ");
		String endereco = input.nextLine();
		try {
			sistemaFacade.criarUsuario(login, nome, endereco);
			System.out.println("\n Usuario cadastrado com sucesso!\n");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		try {
			if(sistemaFacade.getSistema().retornaUsuarioPeloLogin(login).getSenha() == null)
				sistemaFacade.getSistema().retornaUsuarioPeloLogin(login).setSenha(senha);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}


	}


	/**
	 * Deleta atividades.
	 * @throws Exception
	 * 			Caso menu principal lance uma excecao.
	 */


	/**
	 * Imprime o cabecalho do menu.
	 */

	private static void imprimeCabecalho() {
		System.out.println("Benvindo a mais nova rede social!\n");
	}


	/**
	 * Captura um inteiro e verifica se ele esta dentro do limite passado como argumento.
	 * @param message
	 * 			Mensagem pra identificar o que esta sendo pedido.
	 * @param lowerLimit
	 * 			Limite inferior.
	 * @param upperLimit
	 * 			Limite superior.
	 * @return Um inteiro caso o pedido esteja entre o limite
	 */

	private static int readIntegerOption(String message, int lowerLimit, int upperLimit) {
		while(true){
			try{
				System.out.print(message);
				Integer number = 0;
				do {
					number = Integer.valueOf(input.nextLine());
				}while(number < lowerLimit || number > upperLimit);
				return number;
			}catch (NumberFormatException nfe) {
				// Just to avoid crashing in the user's face.
			}
		}
	}


	private static int lerOpcao(String mensagem) {
		while(true){
			try{
				System.out.print(mensagem);
				Integer numero = 0;
				numero = Integer.parseInt(input.nextLine());
				return numero;
			}catch (NumberFormatException nfe) {

			}
		}
	}


}

